package com.falm.picturebackend.util;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * Token黑名单工具类 用于管理JWT Token的黑名单，实现用户登出功能
 *
 * @author Administrator
 */
public class TokenBlackListUtil {

    /**
     * 使用线程安全的ConcurrentHashMap存储Token黑名单 Key: Token字符串 Value: Token过期时间（毫秒）
     */
    private static final ConcurrentMap<String, Long> TOKEN_BLACKLIST = new ConcurrentHashMap<>();

    /**
     * 将Token添加到黑名单
     *
     * @param token JWT Token
     */
    public static void addToBlackList(String token) {
        // 获取Token的过期时间
        Long exp = getTokenExpiration(token);
        if (exp != null) {
            TOKEN_BLACKLIST.put(token, exp);
        }
    }

    /**
     * 检查Token是否在黑名单中
     *
     * @param token JWT Token
     * @return 是否在黑名单中
     */
    public static boolean isInBlackList(String token) {
        // 检查Token是否在黑名单中
        if (TOKEN_BLACKLIST.containsKey(token)) {
            // 获取Token的过期时间
            Long exp = TOKEN_BLACKLIST.get(token);
            // 如果Token已过期，则从黑名单中移除
            if (System.currentTimeMillis() > exp) {
                TOKEN_BLACKLIST.remove(token);
                return false;
            }
            return true;
        }
        return false;
    }

    /**
     * 从Token中提取过期时间
     *
     * @param token JWT Token
     * @return 过期时间（毫秒）
     */
    private static Long getTokenExpiration(String token) {
        try {
            // 解析Token获取过期时间
            return (Long)cn.hutool.jwt.JWTUtil.parseToken(token).getPayload().getClaim("exp");
        } catch (Exception e) {
            // 解析失败则返回null
            return null;
        }
    }

    /**
     * 清理过期的Token
     */
    public static void cleanExpiredTokens() {
        Set<String> keys = TOKEN_BLACKLIST.keySet();
        long currentTime = System.currentTimeMillis();
        keys.removeIf(key -> {
            Long exp = TOKEN_BLACKLIST.get(key);
            return exp != null && currentTime > exp;
        });
    }
}